#include "arrayStack.h"

ArrayStack *createArrayStack() {
    // 申请
    ArrayStack *stack = (ArrayStack *)malloc(sizeof(ArrayStack));
    if (stack == NULL) {
        return NULL;
    }
    // 初始化
    for (int i = 0; i < MAXStackSize; ++i) {
        stack->data[i] = 0;
    }
    stack->top = -1;			// 满递增栈，top一定是取低位，又因为是满，top必须指向有效区域，-1
    return stack;
}

void releaseArrayStack(ArrayStack *stack) {
    if (stack) {
        free(stack);
    }
}

/* 1. 越界 上溢出 返回-1
 * 2. 正常按照满递增行为 操作   top的有效范围[0...MAX-1]
 * */
int pushArrayStack(ArrayStack *stack, Element e) {
    if (stack->top >= MAXStackSize - 1) {
        printf("OverFlow!\n");
        return -1;
    }
    stack->data[++stack->top] = e;
    return 0;
}

/* 1. 下越界 没有元素 -1
 * 2. 正常按照满递增行为 操作
 * 弹栈 行为
 * a. 只把元素弹出，但不返回
 * b. 不仅把元素弹出，同时要把这个元素的值更新给调用者
 * */
int popArrayStack(ArrayStack *stack, Element *e) {
    if (stack->top < 0) {
        printf("UnderFlow!\n");
        return -1;
    }
    *e = stack->data[stack->top--];
    return 0;
}